package com.rickpan.service;

import com.rickpan.entity.Note;
import org.springframework.data.domain.Page;

import java.util.List;

/**
 * 便签服务接口
 * 
 * @author RickPan Team
 * @since 2024-01-06
 */
public interface NoteService {

    /**
     * 创建便签
     * 
     * @param userId 用户ID
     * @param title 标题
     * @param content 内容
     * @param markdownContent Markdown内容
     * @param folderId 文件夹ID
     * @return 便签记录
     */
    Note createNote(Long userId, String title, String content, String markdownContent, Long folderId);

    /**
     * 更新便签
     * 
     * @param noteId 便签ID
     * @param userId 用户ID
     * @param title 标题
     * @param content 内容
     * @param markdownContent Markdown内容
     * @param isFavorite 是否收藏
     * @return 更新后的便签记录
     */
    Note updateNote(Long noteId, Long userId, String title, String content, String markdownContent, Boolean isFavorite);

    /**
     * 删除便签
     * 
     * @param noteId 便签ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean deleteNote(Long noteId, Long userId);

    /**
     * 获取便签详情
     *
     * @param noteId 便签ID
     * @param userId 用户ID
     * @return 便签记录
     */
    Note getNoteDetail(Long noteId, Long userId);

    /**
     * 获取便签信息（不增加查看次数）
     *
     * @param noteId 便签ID
     * @param userId 用户ID
     * @return 便签记录
     */
    Note getNoteById(Long noteId, Long userId);

    /**
     * 获取便签列表（分页）
     *
     * @param userId 用户ID
     * @param folderId 文件夹ID
     * @param search 搜索关键词
     * @param isFavorite 是否只显示收藏
     * @param hasReminder 是否只显示有提醒的便签
     * @param page 页码
     * @param size 页大小
     * @return 分页便签列表
     */
    Page<Note> getNotes(Long userId, Long folderId, String search, Boolean isFavorite, Boolean hasReminder, Integer page, Integer size);

    /**
     * 获取最近编辑的便签
     * 
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 最近便签列表
     */
    List<Note> getRecentNotes(Long userId, Integer limit);

    /**
     * 获取收藏的便签
     * 
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 收藏便签列表
     */
    List<Note> getFavoriteNotes(Long userId, Integer limit);

    /**
     * 切换便签收藏状态
     * 
     * @param noteId 便签ID
     * @param userId 用户ID
     * @return 更新后的便签记录
     */
    Note toggleFavorite(Long noteId, Long userId);

    /**
     * 移动便签到指定文件夹
     * 
     * @param noteId 便签ID
     * @param userId 用户ID
     * @param targetFolderId 目标文件夹ID
     * @return 更新后的便签记录
     */
    Note moveNote(Long noteId, Long userId, Long targetFolderId);

    /**
     * 复制便签
     * 
     * @param noteId 便签ID
     * @param userId 用户ID
     * @param newTitle 新标题
     * @return 新便签记录
     */
    Note copyNote(Long noteId, Long userId, String newTitle);

    /**
     * 获取便签统计信息
     *
     * @param userId 用户ID
     * @return 统计信息
     */
    NoteStats getNoteStats(Long userId);

    /**
     * 导出便签为Markdown格式
     *
     * @param noteId 便签ID
     * @param userId 用户ID
     * @return Markdown格式的便签内容
     */
    String exportNoteToMarkdown(Long noteId, Long userId);

    /**
     * 便签统计DTO
     */
    class NoteStats {
        private long totalNotes;
        private long favoriteNotes;
        private long todayNotes;
        
        public NoteStats(long totalNotes, long favoriteNotes, long todayNotes) {
            this.totalNotes = totalNotes;
            this.favoriteNotes = favoriteNotes;
            this.todayNotes = todayNotes;
        }
        
        public long getTotalNotes() { return totalNotes; }
        public void setTotalNotes(long totalNotes) { this.totalNotes = totalNotes; }
        public long getFavoriteNotes() { return favoriteNotes; }
        public void setFavoriteNotes(long favoriteNotes) { this.favoriteNotes = favoriteNotes; }
        public long getTodayNotes() { return todayNotes; }
        public void setTodayNotes(long todayNotes) { this.todayNotes = todayNotes; }
    }
}
